home *** CD-ROM | disk | FTP | other *** search
/ Languguage OS 2 / Languguage OS II Version 10-94 (Knowledge Media)(1994).ISO / language / embedded / mcu / float09.arc / INTFLT.SA < prev    next >
Text File  |  1987-03-04  |  11KB  |  534 lines

  1.  NAM INTFLT
  2.  TTL  FLOATING TO BINARY INTEGER CONVERSION
  3. *
  4. * LINKING LOADER DEFINITIONS
  5. *
  6.  XDEF GETINT,BIGINT,FFIX,FIXNAN,FLOAT,FIXZER
  7.  XDEF  GOSET
  8. *
  9.  XREF ROUND,CLRES,SNORM,LNORM,PREC,ENORM,MOVE
  10.  XREF  ZERO,IOPSUB,RTZERO,FPMOVE,FILSKY,DENORM
  11.  XREF  TFRACT
  12. *
  13. * REVISION HISTORY:
  14. *   DATE    PROGRAMMER     REASON
  15. *
  16. *  23.MAY.80    GREG STEVENS     ORIGINAL CREATION
  17. *  12.JUN.80    G.STEVENS     FIX & OPT. INTEGER
  18. *  04.AUG.80    G. STEVENS     FIX ALL INVOKATIONS OF ROUND
  19. *  06.AUG.80    G. STEVENS     FIX FFIX FOR ZERO AND CCREG
  20. *  07.AUG.80    G. STEVENS     ADD FIXZER & FIX FIXNAN
  21. *  11.AUG.80    G. STEVENS     CHANGE FIXNAN
  22. *  13.AUG.80    G. STEVENS     ADD UTILITY HOOKS IN INTEGER
  23. *  08.OCT.80    G. STEVENS     "GETINT" NOW IGNORES UNNRM ZEROS
  24. *  09.OCT.80    G. STEVENS     "GETINT" INVOKES FPMOVE VS MOVE
  25. *
  26.  PAG
  27. *******************************************************************
  28. *
  29. *  HERE IS THE FUNCTION FCFIX WHICH TAKES A
  30. * F.P. NUMBER AND CONVERTS IT TO A SIGNED BINARY
  31. * INTEGER.
  32. *
  33. *
  34. * PROCEDURE FFIX
  35. *
  36. *  FFIX CONVERTS A F.P. VALUE TO A BINARY INTEGER
  37. * THE RESULT CAN BE EITHER A 16 OR 32 BIT SIGNED
  38. * VALUE. IF THE RESULT OF THE CONVERSION WILL NOT
  39. * FIT INTO THE DESTINATION THEN THE LARGEST INTEGER
  40. * IS RETURNED.
  41. *
  42. *
  43. *
  44. FFIX EQU  *
  45. *
  46. * GET THE INTEGER PART OF THE FLOATING OPERAND
  47. *
  48.  LBSR  GETINT
  49. *
  50. * CONVERT INTEGER PART TO A BINARY INTEGER
  51. *
  52.  LDA  FUNCT,U
  53.  IF  A,EQ,#FCFIXS
  54.    LEAX  SINTSZ,PCR
  55. *
  56.  ELSE
  57.    LEAX  DINTSZ,PCR
  58. *
  59.  ENDIF
  60. *
  61. * IF THE ARGUMENT HAS NO INTEGER PART JUST RETURN
  62. * ZERO AS THE  BINARY INTEGER.
  63. *
  64.  LDD  EXPR,U
  65.  IF  D,LT,#0           NO INTEGER PART
  66.    MOVD  #0,(FRACTR,U)
  67.    MOVD  #0,(FRACTR+2,U)
  68. *
  69.    LDA    CCREG,U        SET Z BIT IN CCREG
  70.    ORA    #Z
  71.    ANDA  #($FF-(N+V+C))
  72.    STA    CCREG,U
  73. *
  74.  ELSE
  75. *
  76. * IF THE EXPONENT OF THE ARGUMENT IS LARGER
  77. * THAN THE INTEGER SIZE IN BITS THEN RETURN
  78. * THE LARGEST POSSIBLE INTEGER OF THE CORRECT
  79. * CORRECT SIZE.
  80. *
  81.    IF  D,GE,(0,X)    EXPONENT TOO BIG
  82.      BSR  BIGINT
  83. *
  84. * ELSE IF THE EXPONENT IS SUCH THAT THE INTEGER
  85. * WILL FIT INTO THE DESIRED DESTINATION THEN
  86. * RIGHT SHIFT THE EXPONENT UP AGAINST THE
  87. * PROPER BYTE BOUNDARY.
  88. *
  89.    ELSE          EXPONENT 0 K
  90.      LEAY  FRACTR,U
  91.      WHILE  D,LT,(0,X)
  92.        ANDCC  #NC     CLEAR CARRY
  93.        RSHIFT  0,Y,4
  94.        INCD
  95. *
  96.      ENDWH
  97.      LDA  CCREG,U      CLEAR BITS IN CCREG
  98.      ANDA  #($FF-(N+C+V+Z))
  99. *
  100. * NOW CHECK THE SIGN OF THE ARGUMENT AND POSSIBLY
  101. * TAKE THE TWO'S COMPLEMENT OF THE RESULT SINCE
  102. * ORIGINALLY THINGS WERE SIGN AND MAGNITUDE.
  103. *
  104.      LDB  ARG2,U
  105.      IFCC  LT         SIGN NEGATIVE
  106.      COM  0,Y
  107.      COM  1,Y
  108.      COM  2,Y
  109.      NEG  3,Y
  110.      BCS  OUTFIX
  111.      INC  2,Y
  112.      BNE  OUTFIX
  113.      INC  1,Y
  114.      BNE  OUTFIX
  115.      INC  0,Y
  116. *
  117. *
  118. OUTFIX     EQU  *
  119. *
  120.      ORA  #N     SET N BIT IN CCREG
  121. *
  122.      ENDIF         SIGN NEGATIVE
  123.      STA  CCREG,U      REPLACE CCREG
  124. *
  125.    ENDIF    EXPONENT TOO LARGE
  126. *
  127.  ENDIF              NO INTEGER PART
  128. *
  129. *
  130.  RTS         RETURN
  131. *
  132. * SIZE TABLE
  133. *
  134. SINTSZ FDB  15
  135. DINTSZ FDB  31
  136. *
  137. *
  138.  PAG
  139. *
  140. *
  141. *******************************************************************
  142. *
  143. * PROCEDURE  BIGINT
  144. *
  145. *   BIGINT HANDLES A FFIX, FLOATING TO BINARY INTEGER
  146. * CONVERSION WHEN THE ARGUMENT IS INFINITY OR THE
  147. * PASSED F.P. VALUE IS TO BIG TO FIT INTO THE DESTINATION.
  148. * THE INTEGER IS SET AS BELOW.
  149. *
  150. *      SHORT POSITIVE     32767
  151. *      SHORT NEGATIVE    -32768
  152. *      LONG POSITIVE    2,147,483,647
  153. *      LONG NEGATIVE   -2,147,483,648
  154. *
  155. *
  156. *    ON ENTRY: U IS THE STACK FRAME POINTER
  157. *
  158. *    ON EXIT: FIRST TWO OR FOUR BYTES OF THE FRACTION
  159. *          CONTAIN THE BINARY INTEGER.
  160. *
  161. *
  162. BIGINT EQU  *
  163. *
  164. * CHECK THE SIGN OF THE ARGUMENT TO SEE WHETHER TO
  165. * RETURN A LARGE POSITIVE OR LARGE NEGATIVE NUMBER.
  166. *
  167.  LDB  CCREG,U         PREPARE TO SET CCREG PROPERLY
  168.  ANDB  #($FF-(N+C+Z))
  169.  ORB  #V
  170.  STB  CCREG,U
  171. *
  172.  LDA  ARG2,U        CHECK SIGN
  173.  IFCC  GE        SIGN POSITIVE
  174.    MOVD  (LPINT,PCR),(FRACTR,U)
  175. *
  176.    MOVD   (LPINT+2,PCR),(FRACTR+2,U)
  177. *
  178. * ELSE IF SIGN NEGATIVE RETURN A LARGE NEGATIVE NUMBER
  179. *
  180.  ELSE            SIGN NEGATIVE
  181.    LDB    CCREG,U
  182.    ORB    #N
  183.    STB    CCREG,U
  184.    MOVD  (LNINT,PCR),(FRACTR,U)
  185. *
  186.    MOVD  (LNINT+2,PCR),(FRACTR+2,U)
  187. *
  188.  ENDIF            SIGN POSITIVE
  189. *
  190. * SET INTEGER OVERFLOW BIT IN MAIN STATUS
  191. *
  192.  LDA  TSTAT,U
  193.  ORA  #ERRIOV
  194.  STA  TSTAT,U
  195. *
  196. *
  197.  RTS      RETURN
  198. *
  199. * INREGER CONSTANTS
  200. *
  201. LPINT FDB  $7FFF,$FFFF
  202. LNINT FDB  $8000,0000
  203. *
  204. *
  205.  PAG
  206. *
  207. *
  208. *******************************************************************
  209. *
  210. * PROCEDURE  FIXNAN
  211. *
  212. *    FIXNAN HANDLES A FFIX, FLOATING TO BINARY INTEGER
  213. * CONVERSION WHEN THE ARGHUMENT IS A NAN. INVALID
  214. * OPERATION (IOP = 3) IS SIGNALED AND THE NAN
  215. * ADDRESS IS RETURNED IN THE PLACE OF THE INTEGER.
  216. *
  217. *  ON ENTRY: U IS THE STACK FRAME POINTER
  218. *
  219. *  ON EXIT: THE FIRST TWO BYTES OF THE FRACTION CONTAIN
  220. *       THE NAN ADDRESS.
  221. *
  222. *
  223. FIXNAN EQU  *
  224. *
  225. *
  226. * SIGNAL INVALIS OPERATION (IOP = 3)
  227. *
  228.  LDD  #(256*ERRIOP)+3     IOP CODE & IOP FLAG
  229.  STD  TSTAT,U         SECONDARY STATUS
  230. *
  231. * RETURN THE NAN ADDRESS
  232. *
  233.  LEAX  ARG2,U        SOURCE
  234.  LEAY  RESULT,U     DESTINATION
  235.  LBSR  FPMOVE
  236.  ANDCC    #NC        CLEAR CARRY
  237.  LSHIFT  FRACT,Y,3    SHIFT ADDRESS TO NEAREST BYTE BOUNDARY
  238.  LSHIFT  FRACT,Y,3
  239. *
  240. *
  241. * RETURN CCREG WITH C BIT SET
  242. *
  243.  LDA  CCREG,U
  244.  ANDA  #($FF-(N+V+Z))
  245.  ORA  #C
  246.  STA  CCREG,U
  247. *
  248. *
  249.  RTS            RETURN
  250. *
  251. *
  252.  PAGE
  253. *
  254. **************************************************************
  255. *
  256. * PROCEDURE FIXZER
  257. *
  258. *     HANDLES FIXES WHERE THE INPUT ARGUMENT IS ZERO
  259. *
  260. *  ON ENTRY: ARG2 CONTAINS THE INPUT ARGUMENT
  261. *         U - STACK FRAME POINTER
  262. *
  263. *  ON EXIT: RESULT CONTAINS THE RESULT
  264. *        U,S - UCHANGED
  265. *        X,Y,D,CC - DESTROYED
  266. *
  267. FIXZER EQU  *
  268. *
  269. * SET Z BIT IN CCREG
  270. *
  271.   LDA  CCREG,U
  272.   ANDA    #($FF-(N+V+C))
  273.   ORA  #Z        SET Z BIT
  274.   STA  CCREG,U
  275. *
  276. * RETURN A ZERO
  277. *
  278.   LBSR    RTZERO
  279. *
  280.   RTS              RETURN
  281. *
  282.  PAGE
  283. *
  284. ******************************************************************
  285. *
  286. * PROCEDURE INTEGER
  287. *
  288. *    INTEGER TAKES THE FLOATING OPERAND RESIDING
  289. * IN ARG2  AND RETURN THE INTEGER PART AS  IT'S
  290. * RESULT
  291. *
  292. * ON ENTRY: ARG2 CONTAINS THE INPUT ARGUMENT
  293. *        U - STACK FRAME POINTER
  294. *
  295. * ON EXIT: STACK FRAME RESULT CONTAINS THE INTEGER PART
  296. *       U - UNCHANGED
  297. *       X,Y,A,B,CC - DESTROYED
  298. *
  299. *
  300. *
  301. * LOCAL EQUATES
  302. *
  303. LOWBND    EQU  -2
  304. *
  305. GETINT EQU  *
  306. *
  307. * FIRST MOVE THE ARGUMENT TO THE RESULT
  308. *
  309.  LEAX  ARG2,U      SOURCE
  310.  LEAY  RESULT,U   DESTINATION
  311. *
  312.  LBSR  FPMOVE
  313. *
  314. * CHECK FOR AN UNNORMAL ZERO AND IF THIS IS THE
  315. * CASE JUST RETURN THE ARGUMENT AS IS
  316. *
  317.   LBSR    TFRACT
  318.   IFCC    EQ         FRACTION IS ZERO
  319.     BRA  EXINT         ESCAPE INTEGER ROUTINE
  320. *
  321.   ENDIF
  322. *
  323. * FIND PRECISION OF THE OPERAND
  324. *
  325.  LDB  RPREC,U      GET THE PRECISION INDEX
  326.  PSHS  B     SAVE PRECISION ON THE STACK
  327. *
  328. * IF THE EXPONENT IS LARGE ENOUGH SO THAT NO FRACTION
  329. * PART EXITS THEN JUST RETURN THE INPUT ARGUMENT AS IS
  330. *
  331.  LEAX  SIGSIZ,PCR   SIGNIFICAND LENGTH TABLE
  332.  ABX
  333.  LDD  EXPR,U
  334.  IF  D,LT,(0,X)    EXPONENT BELOW UPPER BOUND
  335. *
  336. * IF THE EXPONENT IS BELOW THE LOWER BOUND THEN JUST
  337. * OR ALL THE FRACTION BYTES INTO THE STIKY BYTE AND
  338. * ZERO OUT THE FRACTION.
  339. *
  340.    IF  D,LE,#LOWBND     EXPONENT BELOW LOWER BOUND
  341.      CLR  STIKY,U      INITIALIZE STIKY BYTE
  342.      LEAX  RESULT,U
  343.      LBSR  FILSKY         FILL STICKY
  344. *
  345. * NOW UPDATE EXPONENT WITH CORRECT VALUE
  346. *
  347.      LDB  0,S
  348.      LEAX  SIGSIZ,PCR
  349.      MOVD  (B,X),(EXPR,U)
  350. *
  351.      MOVD  (#00),(EXP2,U)
  352. *
  353. * ELSE IF THE EXPONENT WITHIN THE UPPER AND LOWER
  354. * BOUNDS THEN RIGHT SHIFT THE SGNIFICAND WHILE
  355. * INCREMENTING THE EXPONENT WHILE ADDITIONALLY
  356. * ORING INTO THE STIKY BYTE THE BITS THAT FALL
  357. * OFF THE END OF THE STACK FRAME ARGUMENT.
  358. *
  359.    ELSE          EXPONENT WITHIN BOUNDS
  360. *
  361. * NOW UPDATE EXPONENT WITH CORRECT VALUE
  362. *
  363.      LEAX  SIGSIZ,PCR
  364.      LDB  0,S           PRECISION INDEX
  365.      MOVD  (B,X),(EXPR,U)  MOVE EXPONENT
  366. *
  367.      SUBD  EXP2,U    CALCULATES # OF SHIFTS TO DO
  368.      CLR  STIKY,U        INITIALIZE STIKY BYTE
  369.      LEAX  RESULT,U
  370.      LBSR  DENORM        DENORMALIZE RESULT
  371. *
  372. *
  373.    ENDIF      EXPONENT BELOW LOWER BOUND
  374. *
  375. * ROUND THAT FRACTIONAL PART OF SIGNIFICAND LIES
  376. * WITHIN ROUNDING PRECISION
  377. *
  378.    LEAX  RESULT,U
  379.    LBSR  ROUND
  380. *
  381. * NOW NORMALIZE THE RESULT AGAIN
  382. *
  383. * IF THE ARGUMENT WAS ORIGINALLY NORMALIZED THEN
  384. * THEN NORMALIZE AS USUAL
  385. *
  386.    LDA    FRACT2,U    LOOK AT ORIGINAL ARGUMENT
  387.    IFCC  LT        ORIGINALLY NORMALIZED
  388.      LBSR  LNORM
  389. *
  390. * ELSE IF THE ARGUMENT WAS ORIGINALLY UNORMALIZED
  391. * THEN ONLY SHIFT THE SIGNIFICAND UNTIL IT REFLECTS
  392. * THE ORIGINAL PRECISION, I.E. EXPONENT SAME AS BEFORE
  393. *
  394.    ELSE       ORIGINALLY UNORMALIZED
  395.      LDY  EXP2,U  USE ORIGINAL EXP. AS REFERENCE
  396.      LBSR  ENORM
  397. *
  398.    ENDIF      ORIGINALLY NORMALIZED
  399. *
  400.  ENDIF        EXPONENT ABOVE UPPER BOUND
  401. *
  402.  LEAS  1,S       CLEAN UP STACK
  403. *
  404. EXINT  EQU  *
  405. *
  406.  RTS        RETURN
  407. *
  408. *
  409. * SIGNIFICAND SIZE TABLE
  410. *
  411. SIGSIZ FDB  23
  412.        FDB  52
  413.        FDB  63
  414.        FDB  23
  415.        FDB  52
  416. *
  417. * G-BYTE OFFSET TABLE
  418. *
  419. GOSET FCB  3   SINGLE
  420.       FCB  6    DOUBLE
  421.       FCB  8    EXTENDED
  422.       FCB  3   SINGLE
  423.       FCB  6   EXT. FORCE TO DOUBLE
  424. *
  425. *
  426. *
  427. *******************************************************************
  428. *
  429.  TTL INTEGER TO FLOATING CONVERSION
  430. *
  431. ***************************************************************
  432. *
  433. * PROCEDURE FLOAT
  434. *    FLOAT CONVERTS A BINARY INTEGER TO A FLOATING
  435. * REPRESENTATION. THE INPUT ARGUMENT CAN EIHTER BE
  436. * A 16 OR 32 BIT SIGNED INTEGER. IF THE ARGUMENT
  437. * IS 32 BIT LONG AND THE DESTINATION IS SINGLE
  438. * THEN THE VALUE IS ROUNDED ONCE.
  439. *
  440. *  ON ENTRY:
  441. *     U IS A STACK FRAME POINTER
  442. *
  443. *  ON EXIT:
  444. *     RESULT CONTAINS A FLOATING VALUE REPRESENTING
  445. *     THE BINARY INTEGER.
  446. *
  447. FLOAT EQU  *
  448. *
  449.  LEAX  RESULT,U
  450.  LDB  #ARGSIZ-1
  451.  WHILE    B,GE,#00
  452.    CLR    B,X
  453.    DECB
  454. *
  455.  ENDWH
  456. *
  457. * SET EXPONENT TO PROPER VALUE
  458. *
  459.  LDA  FUNCT,U               CHECK FUNCTION
  460.  IF  A,EQ,#FCFLTS           SINGLE PRECISION FLOAT
  461.    LEAY  SINTSZ,PCR
  462. *
  463.  ELSE
  464.    LEAY  DINTSZ,PCR           DOUBLE PRECISION FLOAT
  465. *
  466.  ENDIF
  467. *
  468. * MOVE INTEGER TO RESULT
  469. *
  470.  MOVD  (0,Y),(EXPR,U)
  471. *
  472.  MOVD  (FRACT2,U),(FRACTR,U)
  473.  MOVD  (FRACT2+2,U),(FRACTR+2,U)
  474. *
  475. * CHECK SIGN OF INTEGER AND NEGATE THE INTEGER
  476. * IF NECESSARY.
  477. *
  478.  LDA  FRACTR,U
  479.  IFCC  LT              SIGN NEGATIVE
  480.    LDA    #$80              SET SIGN NEGATIVE
  481.    STA    RESULT,U
  482. *
  483.    LEAX  FRACTR,U
  484.      COM  0,X
  485.      COM  1,X
  486.      COM  2,X
  487.      NEG  3,X
  488.      BCS  OUTFLT
  489.      INC  2,X
  490.      BNE  OUTFLT
  491.      INC  1,X
  492.      BNE  OUTFLT
  493.      INC  0,X
  494. *
  495. *
  496. OUTFLT EQU  *
  497. *
  498.  ENDIF            INTEGER NEGATIVE
  499. *
  500. * NORMALIZE RESULT
  501. *
  502.  LEAX  RESULT,U
  503. *
  504.  LBSR  SNORM
  505. *
  506. * IF THE ARGUMENT WAS 32 BITS LONG AND THE PRECISION
  507. * IS SINGLE, THEN ROUND THE RESULT TO YIELD EXACT
  508. * REPRESENTATION
  509. *
  510.  LDA  FUNCT,U
  511.  IF  A,EQ,#FCFLTD        DOUBLE PRECISION FLOAT
  512.    LDA    RPREC,U        PRECISION RESULT
  513.    IF  A,EQ,#SIN       SINGLE PRECISION
  514.      BRA  RND
  515. *
  516.    ELSE
  517.    IF A,EQ,#EFS         FORCE TO SINGLE:
  518. *
  519. RND EQU  *
  520. *
  521.      STA  STIKY,U         SET STIKY BYTE
  522. *
  523.      LBSR  ROUND         ROUND RESULT
  524. *
  525.    ENDIF
  526.    ENDIF             SINGLE PRECISION
  527. *
  528.  ENDIF                DOUBLE PRECISION FLOAT
  529. *
  530. *
  531.  RTS      RETURN
  532. *
  533. *
  534.